using System;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using SilverMenu;

namespace SilverMenuSample
{
	/// <summary>
	/// This is the main type for your game
	/// </summary>
	public class Game1 : Microsoft.Xna.Framework.Game
	{
		GraphicsDeviceManager graphics;
		SpriteBatch spriteBatch;

        private SilverMenuManager m_manager;
        private List<GestureSample> m_gestures;

		public Game1()
		{
			graphics = new GraphicsDeviceManager(this);
			Content.RootDirectory = "Content";
			Content = new SilverMenuContentManager(Content.ServiceProvider, Content.RootDirectory);

			TouchPanel.EnabledGestures = GestureType.Flick;

			// Frame rate is 30 fps by default for Windows Phone.
			TargetElapsedTime = TimeSpan.FromTicks(333333);
		}

		/// <summary>
		/// Allows the game to perform any initialization it needs to before starting to run.
		/// This is where it can query for any required services and load any non-graphic
		/// related content.  Calling base.Initialize will enumerate through any components
		/// and initialize them as well.
		/// </summary>
		protected override void Initialize()
		{
			// TODO: Add your initialization logic here

			base.Initialize();
		}

		/// <summary>
		/// LoadContent will be called once per game and is the place to load
		/// all of your content.
		/// </summary>
		protected override void LoadContent()
		{
			// Create a new SpriteBatch, which can be used to draw textures.
			spriteBatch = new SpriteBatch(GraphicsDevice);
			//Content.Load<Texture2D>("01");
			m_manager = new SilverMenuManager(Content as SilverMenuContentManager);
			m_manager.LoadMenu("Sample");
			m_manager.DoTransition("home");

            m_gestures = new List<GestureSample>();

			// TODO: use this.Content to load your game content here
		}

		/// <summary>
		/// UnloadContent will be called once per game and is the place to unload
		/// all content.
		/// </summary>
		protected override void UnloadContent()
		{
			// TODO: Unload any non ContentManager content here
		}

		/// <summary>
		/// Allows the game to run logic such as updating the world,
		/// checking for collisions, gathering input, and playing audio.
		/// </summary>
		/// <param name="gameTime">Provides a snapshot of timing values.</param>
		protected override void Update(GameTime gameTime)
		{
			// Allows the game to exit
			if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
				this.Exit();

			float delta = (float) gameTime.ElapsedGameTime.TotalSeconds;
			/*
			while (TouchPanel.IsGestureAvailable)
			{
				GestureSample gs = TouchPanel.ReadGesture();
				if (gs.GestureType == GestureType.Flick)
				{
					if (gs.Delta.X > 0)
					{
						m_manager.DoTransition("home");
					}
					else if (gs.Delta.X < 0)
					{
						m_manager.DoTransition("play");
					}
				}
			}
			*/

            m_gestures.Clear();
            while(TouchPanel.IsGestureAvailable)
                m_gestures.Add(TouchPanel.ReadGesture());

			m_manager.Update(delta, m_gestures);

			base.Update(gameTime);
		}

		/// <summary>
		/// This is called when the game should draw itself.
		/// </summary>
		/// <param name="gameTime">Provides a snapshot of timing values.</param>
		protected override void Draw(GameTime gameTime)
		{
			GraphicsDevice.Clear(Color.CornflowerBlue);

			// TODO: Add your drawing code here
			spriteBatch.Begin();
			m_manager.Draw(spriteBatch);
			spriteBatch.End();

			base.Draw(gameTime);
		}

		private void TestEventHandler(SilverButton sender)
		{
			Debug.WriteLine("HIT Test Event Handler.");
		}
	}
}
